/**
 * 格式化日期
 * @param {string | number | Date} date 日期对象/时间戳/日期字符串
 * @param {string} fmt 格式化模式，默认 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, fmt = 'YYYY-MM-DD HH:mm:ss') {
    if (!date) return '';

    // 如果是时间戳或字符串，转换为Date对象
    if (!(date instanceof Date)) {
        date = new Date(date);
    }

    // 如果转换失败，返回空字符串
    if (isNaN(date.getTime())) {
        return '';
    }

    const opt = {
        'Y+': date.getFullYear().toString(),
        'M+': (date.getMonth() + 1).toString(),
        'D+': date.getDate().toString(),
        'H+': date.getHours().toString(),
        'm+': date.getMinutes().toString(),
        's+': date.getSeconds().toString()
    };

    for (let k in opt) {
        const ret = new RegExp('(' + k + ')').exec(fmt);
        if (ret) {
            fmt = fmt.replace(
                ret[1],
                ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0')
            );
        }
    }

    return fmt;
}

/**
 * 格式化时间为相对时间
 * @param {string | number | Date} date 日期对象/时间戳/日期字符串
 * @returns {string} 相对时间字符串
 */
export function formatRelativeTime(date) {
    if (!date) return '';

    // 转换为Date对象
    const dateObj = new Date(date);
    if (isNaN(dateObj.getTime())) {
        return '';
    }

    const now = new Date();
    const diff = now.getTime() - dateObj.getTime();

    // 小于1分钟
    if (diff < 60000) {
        return '刚刚';
    }
    // 小于1小时
    if (diff < 3600000) {
        return Math.floor(diff / 60000) + '分钟前';
    }
    // 小于24小时
    if (diff < 86400000) {
        return Math.floor(diff / 3600000) + '小时前';
    }
    // 小于30天
    if (diff < 2592000000) {
        return Math.floor(diff / 86400000) + '天前';
    }
    // 大于30天，返回具体日期
    return formatDate(date, 'YYYY-MM-DD');
}